sprintTargerProto = {
    layout : 'table'
    , layoutConfig: { columns:3 }
    , collapsible : true
    , height : 150
    /*, listeners: {
      render: function(panel){
        var dropTarget = new Ext.dd.DropTarget(panel.body,{
          ddGroup: 'printplanning',
          copy: false,
          overClass: 'over',
          notifyDrop: function(dragSource, event, data){
            console.log('dropped', dragSource, event, data);
            panel.body.highlight("00AE00");
          }
        });
      }
    }*/
}
sprintTarget = Ext.extend(Ext.Panel, sprintTargerProto);
sprintTarget.DropZone = Ext.extend(Ext.dd.DropTarget, {
    ddGroup :  'printplanning'
    ,constructor : function(board, cfg){
        this.board = board;
        Ext.dd.ScrollManager.register(board.body);
        sprintTarget.DropZone.superclass.constructor.call(this, board.bwrap.dom, cfg);
        board.body.ddScrollConfig = this.ddScrollConfig;
    },

    ddScrollConfig : {
        vthresh: 50,
        hthresh: -1,
        animate: true,
        increment: 200
    },

    createEvent : function(dd, e, data, col, c, pos){
        return {
            board: this.board,
            panel: data.panel,
            columnIndex: col,
            column: c,
            position: pos,
            data: data,
            source: dd,
            rawEvent: e,
            status: this.dropAllowed
        };
    },

    notifyOver : function(dd, e, data){
        var xy = e.getXY(), board = this.board, px = dd.proxy;

        // case column widths
        if(!this.grid){
            this.grid = this.getGrid();
        }

        // handle case scroll where scrollbars appear during drag
        var cw = board.body.dom.clientWidth;
        if(!this.lastCW){
            this.lastCW = cw;
        }else if(this.lastCW != cw){
            this.lastCW = cw;
            board.doLayout();
            this.grid = this.getGrid();
        }

        // determine column
        var col = 0, xs = this.grid.columnX, cmatch = false;
        for(var len = xs.length; col < len; col++){
            if(xy[0] < (xs[col].x + xs[col].w)){
                cmatch = true;
                break;
            }
        }
        // no match, fix last index
        if(!cmatch){
            col--;
        }

        // find insert position
        var p, match = false, pos = 0,
            c = board.items.itemAt(col),
            items = c.items.items, overSelf = false;

        for(var len = items.length; pos < len; pos++){
            p = items[pos];
            var h = p.el.getHeight();
            if(h === 0){
                overSelf = true;
            }
            else if((p.el.getY()+(h/2)) > xy[1]){
                match = true;
                break;
            }
        }

        pos = (match && p ? pos : c.items.getCount()) + (overSelf ? -1 : 0);
        var overEvent = this.createEvent(dd, e, data, col, c, pos);

        if(board.fireEvent('validatedrop', overEvent) !== false &&
           board.fireEvent('beforedragover', overEvent) !== false){

            // make sure proxy width is fluid
            px.getProxy().setWidth('auto');

            if(p){
                px.moveProxy(p.el.dom.parentNode, match ? p.el.dom : null);
            }else{
                px.moveProxy(c.el.dom, null);
            }

            this.lastPos = {c: c, col: col, p: overSelf || (match && p) ? pos : false};
            this.scrollPos = board.body.getScroll();

            board.fireEvent('dragover', overEvent);

            return overEvent.status;
        }else{
            return overEvent.status;
        }

    },

    notifyOut : function(){
        delete this.grid;
    },

    notifyDrop : function(dd, e, data){
        delete this.grid;
        if(!this.lastPos){
            return;
        }
        var c = this.lastPos.c,
            col = this.lastPos.col,
            pos = this.lastPos.p,
            panel = dd.panel,
            dropEvent = this.createEvent(dd, e, data, col, c,
                pos !== false ? pos : c.items.getCount());

        if(this.board.fireEvent('validatedrop', dropEvent) !== false &&
           this.board.fireEvent('beforedrop', dropEvent) !== false){

            dd.proxy.getProxy().remove();
            panel.el.dom.parentNode.removeChild(dd.panel.el.dom);

            if(pos !== false){
                c.insert(pos, panel);
            }else{
                c.add(panel);
            }

            c.doLayout();

            this.board.fireEvent('drop', dropEvent);

            // scroll position is lost on drop, fix it
            var st = this.scrollPos.top;
            if(st){
                var d = this.board.body.dom;
                setTimeout(function(){
                    d.scrollTop = st;
                }, 10);
            }

        }
        delete this.lastPos;
    },

    // internal cache of body and column coords
    getGrid : function(){
        var box = this.board.bwrap.getBox();
        box.columnX = [];
        this.board.items.each(function(c){
             box.columnX.push({x: c.el.getX(), w: c.el.getWidth()});
        });
        return box;
    },

    // unregister the dropzone from ScrollManager
    unreg: function() {
        Ext.dd.ScrollManager.unregister(this.board.body);
        this.board.DropZone.superclass.unreg.call(this);
    }
});

sprintPlanningProto = {
    backlog : null
    ,sprintpanel : null
    ,initComponent : function()
    {
        sprintPlanning.superclass.initComponent.call(this);
        this.refreshBacklog();
        this.loadSprints();
    }
    , backlogParams : {
        sprint : 0
    }
    , refreshBacklog : function()
    {
        this.backlog.reloadTickets(this.backlogParams);
        this.backlog.doLayout();
    }

    ,loadSprints : function()
    {
        Ext.Ajax.request({
			url:'sprintPlanning/getOpenSprints'
            ,scope: this
            ,failure : sweatShop.globals.formSubmitFailed
            ,success : this.sprintQueryHandler
		});
    }
    , sprintQueryHandler: function (response, request) {
        var result = Ext.util.JSON.decode(response.responseText);
        if (result.success == false) {
            Ext.MessageBox.alert('Error', result.message);
        }else{
            this.addSprints(result.data);
        }
    }
    , addSprints : function (allSprints)
    {
        for (var n in allSprints)
        {
            if(!allSprints[n].sprint) continue;
            this.addSprint(allSprints[n]);
        }
        this.sprintpanel.doLayout();
    }
    , addSprint : function (sprintInfo)
    {
        aSprint = new sprintTarget({
            title: sprintInfo.name+(sprintInfo.current ? ' - Current' : '')
            , id: 'sp-sprint-'+sprintInfo.sprint
            , collapsed : (sprintInfo.current ? false : true)

        });
        console.log(sprintInfo, aSprint);
        this.sprintpanel.add(aSprint);
    }

};
sprintPlanning = Ext.extend(sprintPlanningUi, sprintPlanningProto);